/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *  Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/

import type { languages } from '../../fillers/monaco-editor-core';

export const conf: languages.LanguageConfiguration = {
	comments: {
		lineComment: '//',
		blockComment: ['/*', '*/']
	},
	brackets: [
		['[', ']'],
		['(', ')'],
		['{', '}']
	],
	autoClosingPairs: [
		{ open: '"', close: '"', notIn: ['string', 'comment', 'identifier'] },
		{ open: '[', close: ']', notIn: ['string', 'comment', 'identifier'] },
		{ open: '(', close: ')', notIn: ['string', 'comment', 'identifier'] },
		{ open: '{', close: '}', notIn: ['string', 'comment', 'identifier'] }
	]
};

export const language = <languages.IMonarchLanguage>{
	defaultToken: '',
	tokenPostfix: '.pq',
	ignoreCase: false,

	brackets: [
		{ open: '[', close: ']', token: 'delimiter.square' },
		{ open: '{', close: '}', token: 'delimiter.brackets' },
		{ open: '(', close: ')', token: 'delimiter.parenthesis' }
	],

	operatorKeywords: ['and', 'not', 'or'],

	keywords: [
		'as',
		'each',
		'else',
		'error',
		'false',
		'if',
		'in',
		'is',
		'let',
		'meta',
		'otherwise',
		'section',
		'shared',
		'then',
		'true',
		'try',
		'type'
	],

	constructors: ['#binary', '#date', '#datetime', '#datetimezone', '#duration', '#table', '#time'],

	constants: ['#infinity', '#nan', '#sections', '#shared'],

	typeKeywords: [
		'action',
		'any',
		'anynonnull',
		'none',
		'null',
		'logical',
		'number',
		'time',
		'date',
		'datetime',
		'datetimezone',
		'duration',
		'text',
		'binary',
		'list',
		'record',
		'table',
		'function'
	],

	builtinFunctions: [
		'Access.Database',
		'Action.Return',
		'Action.Sequence',
		'Action.Try',
		'ActiveDirectory.Domains',
		'AdoDotNet.DataSource',
		'AdoDotNet.Query',
		'AdobeAnalytics.Cubes',
		'AnalysisServices.Database',
		'AnalysisServices.Databases',
		'AzureStorage.BlobContents',
		'AzureStorage.Blobs',
		'AzureStorage.Tables',
		'Binary.Buffer',
		'Binary.Combine',
		'Binary.Compress',
		'Binary.Decompress',
		'Binary.End',
		'Binary.From',
		'Binary.FromList',
		'Binary.FromText',
		'Binary.InferContentType',
		'Binary.Length',
		'Binary.ToList',
		'Binary.ToText',
		'BinaryFormat.7BitEncodedSignedInteger',
		'BinaryFormat.7BitEncodedUnsignedInteger',
		'BinaryFormat.Binary',
		'BinaryFormat.Byte',
		'BinaryFormat.ByteOrder',
		'BinaryFormat.Choice',
		'BinaryFormat.Decimal',
		'BinaryFormat.Double',
		'BinaryFormat.Group',
		'BinaryFormat.Length',
		'BinaryFormat.List',
		'BinaryFormat.Null',
		'BinaryFormat.Record',
		'BinaryFormat.SignedInteger16',
		'BinaryFormat.SignedInteger32',
		'BinaryFormat.SignedInteger64',
		'BinaryFormat.Single',
		'BinaryFormat.Text',
		'BinaryFormat.Transform',
		'BinaryFormat.UnsignedInteger16',
		'BinaryFormat.UnsignedInteger32',
		'BinaryFormat.UnsignedInteger64',
		'Byte.From',
		'Character.FromNumber',
		'Character.ToNumber',
		'Combiner.CombineTextByDelimiter',
		'Combiner.CombineTextByEachDelimiter',
		'Combiner.CombineTextByLengths',
		'Combiner.CombineTextByPositions',
		'Combiner.CombineTextByRanges',
		'Comparer.Equals',
		'Comparer.FromCulture',
		'Comparer.Ordinal',
		'Comparer.OrdinalIgnoreCase',
		'Csv.Document',
		'Cube.AddAndExpandDimensionColumn',
		'Cube.AddMeasureColumn',
		'Cube.ApplyParameter',
		'Cube.AttributeMemberId',
		'Cube.AttributeMemberProperty',
		'Cube.CollapseAndRemoveColumns',
		'Cube.Dimensions',
		'Cube.DisplayFolders',
		'Cube.Measures',
		'Cube.Parameters',
		'Cube.Properties',
		'Cube.PropertyKey',
		'Cube.ReplaceDimensions',
		'Cube.Transform',
		'Currency.From',
		'DB2.Database',
		'Date.AddDays',
		'Date.AddMonths',
		'Date.AddQuarters',
		'Date.AddWeeks',
		'Date.AddYears',
		'Date.Day',
		'Date.DayOfWeek',
		'Date.DayOfWeekName',
		'Date.DayOfYear',
		'Date.DaysInMonth',
		'Date.EndOfDay',
		'Date.EndOfMonth',
		'Date.EndOfQuarter',
		'Date.EndOfWeek',
		'Date.EndOfYear',
		'Date.From',
		'Date.FromText',
		'Date.IsInCurrentDay',
		'Date.IsInCurrentMonth',
		'Date.IsInCurrentQuarter',
		'Date.IsInCurrentWeek',
		'Date.IsInCurrentYear',
		'Date.IsInNextDay',
		'Date.IsInNextMonth',
		'Date.IsInNextNDays',
		'Date.IsInNextNMonths',
		'Date.IsInNextNQuarters',
		'Date.IsInNextNWeeks',
		'Date.IsInNextNYears',
		'Date.IsInNextQuarter',
		'Date.IsInNextWeek',
		'Date.IsInNextYear',
		'Date.IsInPreviousDay',
		'Date.IsInPreviousMonth',
		'Date.IsInPreviousNDays',
		'Date.IsInPreviousNMonths',
		'Date.IsInPreviousNQuarters',
		'Date.IsInPreviousNWeeks',
		'Date.IsInPreviousNYears',
		'Date.IsInPreviousQuarter',
		'Date.IsInPreviousWeek',
		'Date.IsInPreviousYear',
		'Date.IsInYearToDate',
		'Date.IsLeapYear',
		'Date.Month',
		'Date.MonthName',
		'Date.QuarterOfYear',
		'Date.StartOfDay',
		'Date.StartOfMonth',
		'Date.StartOfQuarter',
		'Date.StartOfWeek',
		'Date.StartOfYear',
		'Date.ToRecord',
		'Date.ToText',
		'Date.WeekOfMonth',
		'Date.WeekOfYear',
		'Date.Year',
		'DateTime.AddZone',
		'DateTime.Date',
		'DateTime.FixedLocalNow',
		'DateTime.From',
		'DateTime.FromFileTime',
		'DateTime.FromText',
		'DateTime.IsInCurrentHour',
		'DateTime.IsInCurrentMinute',
		'DateTime.IsInCurrentSecond',
		'DateTime.IsInNextHour',
		'DateTime.IsInNextMinute',
		'DateTime.IsInNextNHours',
		'DateTime.IsInNextNMinutes',
		'DateTime.IsInNextNSeconds',
		'DateTime.IsInNextSecond',
		'DateTime.IsInPreviousHour',
		'DateTime.IsInPreviousMinute',
		'DateTime.IsInPreviousNHours',
		'DateTime.IsInPreviousNMinutes',
		'DateTime.IsInPreviousNSeconds',
		'DateTime.IsInPreviousSecond',
		'DateTime.LocalNow',
		'DateTime.Time',
		'DateTime.ToRecord',
		'DateTime.ToText',
		'DateTimeZone.FixedLocalNow',
		'DateTimeZone.FixedUtcNow',
		'DateTimeZone.From',
		'DateTimeZone.FromFileTime',
		'DateTimeZone.FromText',
		'DateTimeZone.LocalNow',
		'DateTimeZone.RemoveZone',
		'DateTimeZone.SwitchZone',
		'DateTimeZone.ToLocal',
		'DateTimeZone.ToRecord',
		'DateTimeZone.ToText',
		'DateTimeZone.ToUtc',
		'DateTimeZone.UtcNow',
		'DateTimeZone.ZoneHours',
		'DateTimeZone.ZoneMinutes',
		'Decimal.From',
		'Diagnostics.ActivityId',
		'Diagnostics.Trace',
		'DirectQueryCapabilities.From',
		'Double.From',
		'Duration.Days',
		'Duration.From',
		'Duration.FromText',
		'Duration.Hours',
		'Duration.Minutes',
		'Duration.Seconds',
		'Duration.ToRecord',
		'Duration.ToText',
		'Duration.TotalDays',
		'Duration.TotalHours',
		'Duration.TotalMinutes',
		'Duration.TotalSeconds',
		'Embedded.Value',
		'Error.Record',
		'Excel.CurrentWorkbook',
		'Excel.Workbook',
		'Exchange.Contents',
		'Expression.Constant',
		'Expression.Evaluate',
		'Expression.Identifier',
		'Facebook.Graph',
		'File.Contents',
		'Folder.Contents',
		'Folder.Files',
		'Function.From',
		'Function.Invoke',
		'Function.InvokeAfter',
		'Function.IsDataSource',
		'GoogleAnalytics.Accounts',
		'Guid.From',
		'HdInsight.Containers',
		'HdInsight.Contents',
		'HdInsight.Files',
		'Hdfs.Contents',
		'Hdfs.Files',
		'Informix.Database',
		'Int16.From',
		'Int32.From',
		'Int64.From',
		'Int8.From',
		'ItemExpression.From',
		'Json.Document',
		'Json.FromValue',
		'Lines.FromBinary',
		'Lines.FromText',
		'Lines.ToBinary',
		'Lines.ToText',
		'List.Accumulate',
		'List.AllTrue',
		'List.Alternate',
		'List.AnyTrue',
		'List.Average',
		'List.Buffer',
		'List.Combine',
		'List.Contains',
		'List.ContainsAll',
		'List.ContainsAny',
		'List.Count',
		'List.Covariance',
		'List.DateTimeZones',
		'List.DateTimes',
		'List.Dates',
		'List.Difference',
		'List.Distinct',
		'List.Durations',
		'List.FindText',
		'List.First',
		'List.FirstN',
		'List.Generate',
		'List.InsertRange',
		'List.Intersect',
		'List.IsDistinct',
		'List.IsEmpty',
		'List.Last',
		'List.LastN',
		'List.MatchesAll',
		'List.MatchesAny',
		'List.Max',
		'List.MaxN',
		'List.Median',
		'List.Min',
		'List.MinN',
		'List.Mode',
		'List.Modes',
		'List.NonNullCount',
		'List.Numbers',
		'List.PositionOf',
		'List.PositionOfAny',
		'List.Positions',
		'List.Product',
		'List.Random',
		'List.Range',
		'List.RemoveFirstN',
		'List.RemoveItems',
		'List.RemoveLastN',
		'List.RemoveMatchingItems',
		'List.RemoveNulls',
		'List.RemoveRange',
		'List.Repeat',
		'List.ReplaceMatchingItems',
		'List.ReplaceRange',
		'List.ReplaceValue',
		'List.Reverse',
		'List.Select',
		'List.Single',
		'List.SingleOrDefault',
		'List.Skip',
		'List.Sort',
		'List.StandardDeviation',
		'List.Sum',
		'List.Times',
		'List.Transform',
		'List.TransformMany',
		'List.Union',
		'List.Zip',
		'Logical.From',
		'Logical.FromText',
		'Logical.ToText',
		'MQ.Queue',
		'MySQL.Database',
		'Number.Abs',
		'Number.Acos',
		'Number.Asin',
		'Number.Atan',
		'Number.Atan2',
		'Number.BitwiseAnd',
		'Number.BitwiseNot',
		'Number.BitwiseOr',
		'Number.BitwiseShiftLeft',
		'Number.BitwiseShiftRight',
		'Number.BitwiseXor',
		'Number.Combinations',
		'Number.Cos',
		'Number.Cosh',
		'Number.Exp',
		'Number.Factorial',
		'Number.From',
		'Number.FromText',
		'Number.IntegerDivide',
		'Number.IsEven',
		'Number.IsNaN',
		'Number.IsOdd',
		'Number.Ln',
		'Number.Log',
		'Number.Log10',
		'Number.Mod',
		'Number.Permutations',
		'Number.Power',
		'Number.Random',
		'Number.RandomBetween',
		'Number.Round',
		'Number.RoundAwayFromZero',
		'Number.RoundDown',
		'Number.RoundTowardZero',
		'Number.RoundUp',
		'Number.Sign',
		'Number.Sin',
		'Number.Sinh',
		'Number.Sqrt',
		'Number.Tan',
		'Number.Tanh',
		'Number.ToText',
		'OData.Feed',
		'Odbc.DataSource',
		'Odbc.Query',
		'OleDb.DataSource',
		'OleDb.Query',
		'Oracle.Database',
		'Percentage.From',
		'PostgreSQL.Database',
		'RData.FromBinary',
		'Record.AddField',
		'Record.Combine',
		'Record.Field',
		'Record.FieldCount',
		'Record.FieldNames',
		'Record.FieldOrDefault',
		'Record.FieldValues',
		'Record.FromList',
		'Record.FromTable',
		'Record.HasFields',
		'Record.RemoveFields',
		'Record.RenameFields',
		'Record.ReorderFields',
		'Record.SelectFields',
		'Record.ToList',
		'Record.ToTable',
		'Record.TransformFields',
		'Replacer.ReplaceText',
		'Replacer.ReplaceValue',
		'RowExpression.Column',
		'RowExpression.From',
		'Salesforce.Data',
		'Salesforce.Reports',
		'SapBusinessWarehouse.Cubes',
		'SapHana.Database',
		'SharePoint.Contents',
		'SharePoint.Files',
		'SharePoint.Tables',
		'Single.From',
		'Soda.Feed',
		'Splitter.SplitByNothing',
		'Splitter.SplitTextByAnyDelimiter',
		'Splitter.SplitTextByDelimiter',
		'Splitter.SplitTextByEachDelimiter',
		'Splitter.SplitTextByLengths',
		'Splitter.SplitTextByPositions',
		'Splitter.SplitTextByRanges',
		'Splitter.SplitTextByRepeatedLengths',
		'Splitter.SplitTextByWhitespace',
		'Sql.Database',
		'Sql.Databases',
		'SqlExpression.SchemaFrom',
		'SqlExpression.ToExpression',
		'Sybase.Database',
		'Table.AddColumn',
		'Table.AddIndexColumn',
		'Table.AddJoinColumn',
		'Table.AddKey',
		'Table.AggregateTableColumn',
		'Table.AlternateRows',
		'Table.Buffer',
		'Table.Column',
		'Table.ColumnCount',
		'Table.ColumnNames',
		'Table.ColumnsOfType',
		'Table.Combine',
		'Table.CombineColumns',
		'Table.Contains',
		'Table.ContainsAll',
		'Table.ContainsAny',
		'Table.DemoteHeaders',
		'Table.Distinct',
		'Table.DuplicateColumn',
		'Table.ExpandListColumn',
		'Table.ExpandRecordColumn',
		'Table.ExpandTableColumn',
		'Table.FillDown',
		'Table.FillUp',
		'Table.FilterWithDataTable',
		'Table.FindText',
		'Table.First',
		'Table.FirstN',
		'Table.FirstValue',
		'Table.FromColumns',
		'Table.FromList',
		'Table.FromPartitions',
		'Table.FromRecords',
		'Table.FromRows',
		'Table.FromValue',
		'Table.Group',
		'Table.HasColumns',
		'Table.InsertRows',
		'Table.IsDistinct',
		'Table.IsEmpty',
		'Table.Join',
		'Table.Keys',
		'Table.Last',
		'Table.LastN',
		'Table.MatchesAllRows',
		'Table.MatchesAnyRows',
		'Table.Max',
		'Table.MaxN',
		'Table.Min',
		'Table.MinN',
		'Table.NestedJoin',
		'Table.Partition',
		'Table.PartitionValues',
		'Table.Pivot',
		'Table.PositionOf',
		'Table.PositionOfAny',
		'Table.PrefixColumns',
		'Table.Profile',
		'Table.PromoteHeaders',
		'Table.Range',
		'Table.RemoveColumns',
		'Table.RemoveFirstN',
		'Table.RemoveLastN',
		'Table.RemoveMatchingRows',
		'Table.RemoveRows',
		'Table.RemoveRowsWithErrors',
		'Table.RenameColumns',
		'Table.ReorderColumns',
		'Table.Repeat',
		'Table.ReplaceErrorValues',
		'Table.ReplaceKeys',
		'Table.ReplaceMatchingRows',
		'Table.ReplaceRelationshipIdentity',
		'Table.ReplaceRows',
		'Table.ReplaceValue',
		'Table.ReverseRows',
		'Table.RowCount',
		'Table.Schema',
		'Table.SelectColumns',
		'Table.SelectRows',
		'Table.SelectRowsWithErrors',
		'Table.SingleRow',
		'Table.Skip',
		'Table.Sort',
		'Table.SplitColumn',
		'Table.ToColumns',
		'Table.ToList',
		'Table.ToRecords',
		'Table.ToRows',
		'Table.TransformColumnNames',
		'Table.TransformColumnTypes',
		'Table.TransformColumns',
		'Table.TransformRows',
		'Table.Transpose',
		'Table.Unpivot',
		'Table.UnpivotOtherColumns',
		'Table.View',
		'Table.ViewFunction',
		'TableAction.DeleteRows',
		'TableAction.InsertRows',
		'TableAction.UpdateRows',
		'Tables.GetRelationships',
		'Teradata.Database',
		'Text.AfterDelimiter',
		'Text.At',
		'Text.BeforeDelimiter',
		'Text.BetweenDelimiters',
		'Text.Clean',
		'Text.Combine',
		'Text.Contains',
		'Text.End',
		'Text.EndsWith',
		'Text.Format',
		'Text.From',
		'Text.FromBinary',
		'Text.Insert',
		'Text.Length',
		'Text.Lower',
		'Text.Middle',
		'Text.NewGuid',
		'Text.PadEnd',
		'Text.PadStart',
		'Text.PositionOf',
		'Text.PositionOfAny',
		'Text.Proper',
		'Text.Range',
		'Text.Remove',
		'Text.RemoveRange',
		'Text.Repeat',
		'Text.Replace',
		'Text.ReplaceRange',
		'Text.Select',
		'Text.Split',
		'Text.SplitAny',
		'Text.Start',
		'Text.StartsWith',
		'Text.ToBinary',
		'Text.ToList',
		'Text.Trim',
		'Text.TrimEnd',
		'Text.TrimStart',
		'Text.Upper',
		'Time.EndOfHour',
		'Time.From',
		'Time.FromText',
		'Time.Hour',
		'Time.Minute',
		'Time.Second',
		'Time.StartOfHour',
		'Time.ToRecord',
		'Time.ToText',
		'Type.AddTableKey',
		'Type.ClosedRecord',
		'Type.Facets',
		'Type.ForFunction',
		'Type.ForRecord',
		'Type.FunctionParameters',
		'Type.FunctionRequiredParameters',
		'Type.FunctionReturn',
		'Type.Is',
		'Type.IsNullable',
		'Type.IsOpenRecord',
		'Type.ListItem',
		'Type.NonNullable',
		'Type.OpenRecord',
		'Type.RecordFields',
		'Type.ReplaceFacets',
		'Type.ReplaceTableKeys',
		'Type.TableColumn',
		'Type.TableKeys',
		'Type.TableRow',
		'Type.TableSchema',
		'Type.Union',
		'Uri.BuildQueryString',
		'Uri.Combine',
		'Uri.EscapeDataString',
		'Uri.Parts',
		'Value.Add',
		'Value.As',
		'Value.Compare',
		'Value.Divide',
		'Value.Equals',
		'Value.Firewall',
		'Value.FromText',
		'Value.Is',
		'Value.Metadata',
		'Value.Multiply',
		'Value.NativeQuery',
		'Value.NullableEquals',
		'Value.RemoveMetadata',
		'Value.ReplaceMetadata',
		'Value.ReplaceType',
		'Value.Subtract',
		'Value.Type',
		'ValueAction.NativeStatement',
		'ValueAction.Replace',
		'Variable.Value',
		'Web.Contents',
		'Web.Page',
		'WebAction.Request',
		'Xml.Document',
		'Xml.Tables'
	],

	builtinConstants: [
		'BinaryEncoding.Base64',
		'BinaryEncoding.Hex',
		'BinaryOccurrence.Optional',
		'BinaryOccurrence.Repeating',
		'BinaryOccurrence.Required',
		'ByteOrder.BigEndian',
		'ByteOrder.LittleEndian',
		'Compression.Deflate',
		'Compression.GZip',
		'CsvStyle.QuoteAfterDelimiter',
		'CsvStyle.QuoteAlways',
		'Culture.Current',
		'Day.Friday',
		'Day.Monday',
		'Day.Saturday',
		'Day.Sunday',
		'Day.Thursday',
		'Day.Tuesday',
		'Day.Wednesday',
		'ExtraValues.Error',
		'ExtraValues.Ignore',
		'ExtraValues.List',
		'GroupKind.Global',
		'GroupKind.Local',
		'JoinAlgorithm.Dynamic',
		'JoinAlgorithm.LeftHash',
		'JoinAlgorithm.LeftIndex',
		'JoinAlgorithm.PairwiseHash',
		'JoinAlgorithm.RightHash',
		'JoinAlgorithm.RightIndex',
		'JoinAlgorithm.SortMerge',
		'JoinKind.FullOuter',
		'JoinKind.Inner',
		'JoinKind.LeftAnti',
		'JoinKind.LeftOuter',
		'JoinKind.RightAnti',
		'JoinKind.RightOuter',
		'JoinSide.Left',
		'JoinSide.Right',
		'MissingField.Error',
		'MissingField.Ignore',
		'MissingField.UseNull',
		'Number.E',
		'Number.Epsilon',
		'Number.NaN',
		'Number.NegativeInfinity',
		'Number.PI',
		'Number.PositiveInfinity',
		'Occurrence.All',
		'Occurrence.First',
		'Occurrence.Last',
		'Occurrence.Optional',
		'Occurrence.Repeating',
		'Occurrence.Required',
		'Order.Ascending',
		'Order.Descending',
		'Precision.Decimal',
		'Precision.Double',
		'QuoteStyle.Csv',
		'QuoteStyle.None',
		'RelativePosition.FromEnd',
		'RelativePosition.FromStart',
		'RoundingMode.AwayFromZero',
		'RoundingMode.Down',
		'RoundingMode.ToEven',
		'RoundingMode.TowardZero',
		'RoundingMode.Up',
		'SapHanaDistribution.All',
		'SapHanaDistribution.Connection',
		'SapHanaDistribution.Off',
		'SapHanaDistribution.Statement',
		'SapHanaRangeOperator.Equals',
		'SapHanaRangeOperator.GreaterThan',
		'SapHanaRangeOperator.GreaterThanOrEquals',
		'SapHanaRangeOperator.LessThan',
		'SapHanaRangeOperator.LessThanOrEquals',
		'SapHanaRangeOperator.NotEquals',
		'TextEncoding.Ascii',
		'TextEncoding.BigEndianUnicode',
		'TextEncoding.Unicode',
		'TextEncoding.Utf16',
		'TextEncoding.Utf8',
		'TextEncoding.Windows',
		'TraceLevel.Critical',
		'TraceLevel.Error',
		'TraceLevel.Information',
		'TraceLevel.Verbose',
		'TraceLevel.Warning',
		'WebMethod.Delete',
		'WebMethod.Get',
		'WebMethod.Head',
		'WebMethod.Patch',
		'WebMethod.Post',
		'WebMethod.Put'
	],

	builtinTypes: [
		'Action.Type',
		'Any.Type',
		'Binary.Type',
		'BinaryEncoding.Type',
		'BinaryOccurrence.Type',
		'Byte.Type',
		'ByteOrder.Type',
		'Character.Type',
		'Compression.Type',
		'CsvStyle.Type',
		'Currency.Type',
		'Date.Type',
		'DateTime.Type',
		'DateTimeZone.Type',
		'Day.Type',
		'Decimal.Type',
		'Double.Type',
		'Duration.Type',
		'ExtraValues.Type',
		'Function.Type',
		'GroupKind.Type',
		'Guid.Type',
		'Int16.Type',
		'Int32.Type',
		'Int64.Type',
		'Int8.Type',
		'JoinAlgorithm.Type',
		'JoinKind.Type',
		'JoinSide.Type',
		'List.Type',
		'Logical.Type',
		'MissingField.Type',
		'None.Type',
		'Null.Type',
		'Number.Type',
		'Occurrence.Type',
		'Order.Type',
		'Password.Type',
		'Percentage.Type',
		'Precision.Type',
		'QuoteStyle.Type',
		'Record.Type',
		'RelativePosition.Type',
		'RoundingMode.Type',
		'SapHanaDistribution.Type',
		'SapHanaRangeOperator.Type',
		'Single.Type',
		'Table.Type',
		'Text.Type',
		'TextEncoding.Type',
		'Time.Type',
		'TraceLevel.Type',
		'Type.Type',
		'Uri.Type',
		'WebMethod.Type'
	],

	tokenizer: {
		root: [
			// quoted identifier
			[/#"[\w \.]+"/, 'identifier.quote'],

			// numbers
			[/\d*\.\d+([eE][\-+]?\d+)?/, 'number.float'],
			[/0[xX][0-9a-fA-F]+/, 'number.hex'],
			[/\d+([eE][\-+]?\d+)?/, 'number'],

			// keywords
			[
				/(#?[a-z]+)\b/,
				{
					cases: {
						'@typeKeywords': 'type',
						'@keywords': 'keyword',
						'@constants': 'constant',
						'@constructors': 'constructor',
						'@operatorKeywords': 'operators',
						'@default': 'identifier'
					}
				}
			],

			// built-in types
			[
				/\b([A-Z][a-zA-Z0-9]+\.Type)\b/,
				{
					cases: {
						'@builtinTypes': 'type',
						'@default': 'identifier'
					}
				}
			],

			// other built-ins
			[
				/\b([A-Z][a-zA-Z0-9]+\.[A-Z][a-zA-Z0-9]+)\b/,
				{
					cases: {
						'@builtinFunctions': 'keyword.function',
						'@builtinConstants': 'constant',
						'@default': 'identifier'
					}
				}
			],

			// other identifiers
			[/\b([a-zA-Z_][\w\.]*)\b/, 'identifier'],

			{ include: '@whitespace' },
			{ include: '@comments' },
			{ include: '@strings' },

			[/[{}()\[\]]/, '@brackets'],
			[/([=\+<>\-\*&@\?\/!])|([<>]=)|(<>)|(=>)|(\.\.\.)|(\.\.)/, 'operators'],
			[/[,;]/, 'delimiter']
		],

		whitespace: [[/\s+/, 'white']],

		comments: [
			['\\/\\*', 'comment', '@comment'],
			['\\/\\/+.*', 'comment']
		],

		comment: [
			['\\*\\/', 'comment', '@pop'],
			['.', 'comment']
		],

		strings: [['"', 'string', '@string']],

		string: [
			['""', 'string.escape'],
			['"', 'string', '@pop'],
			['.', 'string']
		]
	}
};
